﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using KPIS.GERP.GFMS.BLL;
using KPIS.GERP.GFMS.IBLL;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.UI;
using Telerik.Web.UI;
using KPIS.GERP.GFMS.IBLL;
using KPIS.GERP.GFMS.BLL;
using KPIS.GERP.GFMS.MODEL;
using KPIS.GERP.GFMS.APP.App_UI.Commons;
using KPIS.GERP.GFMS.IDAL;
using KPIS.GERP.GFMS.DAL;

namespace KPIS.GERP.GFMS.APP.App_UI.Commons
{
    public static class PipExporter
    {
        public static string PadRightOrCutoff(string strSource, int limit, char charToPad, bool modePadLeft = false)
        {
            // prevent null
            if (strSource == null) strSource = "";

            if (modePadLeft == false)
            {
                // padright
                strSource = strSource.PadRight(limit, charToPad);

                // cut off if source has more lenght than limit
                strSource = strSource.Substring(0, Math.Min(strSource.Length, limit));

                return strSource;
            }
            else
            {
                // padleft
                strSource = strSource.PadLeft(limit, charToPad);

                // cut off if source has more lenght than limit
                if (limit >= strSource.Length) return strSource;
                return strSource.Substring(strSource.Length - limit);

            }
        }

        public static void LoadFixlenghtPip(string strPipRefNo, out string errorString)
        {
            errorString = "";
            string contentExport = "";
            List<string> contentExportLines = new List<string>();
            int runningSequence = 1;
            Main main = new Main();
            IBLL_FIM_Payments p = new B_FIM_Payments();
            IBLL_ICM_MasContactBank icmConBank = new B_ICM_MasContactBank();
            IDAL_HRM_PS_EMP_BOOK_BANKS empBank = new D_HRM_PS_EMP_BOOK_BANKS();
            var paymentsRealPaid = p.GetRealPaid(strPipRefNo);
            string BankCode, BranchCode, AccountCode, AccountName;

            foreach (var rp in paymentsRealPaid)
            {
                #region Validate

                if (rp.contact_seq.HasValue)
                {
                    var toBankAccount = icmConBank.GetList(rp.contact_seq).Where(m => m.Bank_Acc_Seq == rp.to_bank_acc_id).FirstOrDefault();
                    BankCode = toBankAccount.BankCode;
                    BranchCode = toBankAccount.BranchCode;
                    AccountCode = toBankAccount.AccountCode;
                    AccountName = toBankAccount.AccountName.Replace("\t", "");
                }
                else
                {
                    var toBankAccount = empBank.GetFull(rp.emp_seq).Where(m => m.BOOK_SEQ == rp.to_bank_acc_id).FirstOrDefault();
                    BankCode = toBankAccount.BANK_CODE;
                    BranchCode = toBankAccount.BRANCH_CODE;
                    AccountCode = toBankAccount.BANK_ACC_NO;
                    AccountName = toBankAccount.BANK_ACC_NAME;
                }

                if (string.IsNullOrEmpty(BankCode))
                {
                    errorString += "ไม่ได้ระบุบัญชีเจ้าหนี้ไว้ในรายการ "
                                   + (rp.pay_name ?? "").Substring(0, Math.Min((rp.pay_name ?? "").Length, 20))
                                   + " (" + (rp.amount ?? 0).ToString("#,##0.00") + ".-)  ";
                    continue;
                }

                if (!rp.real_pay_date.HasValue)
                {
                    errorString += "ไม่ได้ระบุวันจ่ายจริงไว้ในรายการ "
                                   + (rp.pay_name ?? "").Substring(0, Math.Min((rp.pay_name ?? "").Length, 20))
                                   + " (" + (rp.amount ?? 0).ToString("#,##0.00") + ".-)  ";
                    continue;
                }

                #endregion

                string line = "";
                //ประเภทของข้อมูล			1	1	1	C	 FIX  'D'	
                line += "D";

                //วันที่มีผลในการเข้าบัญชีอัตโนมัติ			8	2	9	N	 (YYYYMMDD)  , 20051130	
                line += rp.real_pay_date.Value.ToString("yyyyMMdd", new CultureInfo("en-US"));

                //เลขที่บัญชีเงินฝากที่บริษัทเปิดกับธนาคาร			11	10	20	N	 0 + เลขที่บัญชีบริษัท 10 หลัก	
                line += PadRightOrCutoff(rp.from_bank_acc_name, 11, '0', true);

                //วันที่สร้างข้อมูล			8	21	28	N	 (YYYYMMDD)  , 20051113	
                line += DateTime.Now.ToString("yyyyMMdd", new CultureInfo("en-US"));

                //ลำดับที่ของข้อมูล			6	29	34	N	 เริ่มจาก 000001	
                line += PadRightOrCutoff((runningSequence++).ToString(), 6, '0', true);

                //รหัสธนาคารของผู้รับโอน			3	35	37	N	 ตามเอกสารแนบ 4  เช่น ไทยธนาคาร = 022	
                line += PadRightOrCutoff(BankCode, 3, '0', true);

                //รหัสสาขาของผู้รับโอน			4	38	41	N	 0 +3 ตัวแรกของเลขที่บัญชีผู้รับโอน	
                line += PadRightOrCutoff(BranchCode ?? "1", 4, '0', true);

                //เลขที่บัญชีผู้รับโอน			11	42	52	N	 0 + ACCOUNT 10 หลัก ผู้รับโอน	
                line += PadRightOrCutoff(AccountCode, 11, '0', true);

                //ชื่อบัญชีผู้รับโอน			60	53	112	C	 60 ตัวอักษร 	 
                line += PadRightOrCutoff(AccountName, 60, ' ');

                //ชนิดของข้อมูล  CREDIT หรือ DEBIT			1	113	113	C	 FIX  'C' 	
                line += "C";

                //จำนวนเงินที่ต้องการเข้าบัญชี			13	114	126	N	  9 (11)V99 ไม่มีจุดทศนิยม	
                line += PadRightOrCutoff((rp.amount ?? 0).ToString("0.00").Replace(".", ""), 13, '0', true);

                //ประเภทของบริการที่ธนาคารเปิดรับ			2	127	128	N	         ตามเอสารแนบ 1	
                line += "59";//"99";

                //สถานะของรายการ			2	129	130	N	 ตามเอกสารแนบ  3    Fix '00'	
                line += "00";

                //รหัสการเข้าบัญชีของไทยธนาคาร			2	131	132	N	 Fix '78'	
                line += "78";

                //ข้อมูลอ้างอิงสำหรับธนาคารผู้ส่งข้อมูล			10	133	142	C	 ข้อมูลใดๆ	
                line += PadRightOrCutoff("", 10, ' ');

                //ข้อมูลอ้างอิงสำหรับธนาคารผู้รับข้อมูล			20	143	162	C	 ข้อมูลใดๆ	
                line += PadRightOrCutoff("", 20, ' ');

                //พื้นที่ว่าง			38	163	200	C	 เติม Space ทั้งหมดตามความกว้าง	
                line += PadRightOrCutoff("", 38, ' ');
                  
                if (line.Length%200 != 0) errorString += (" ทำข้อมูลไม่ได้ตรงตามฟอร์แมตที่ต้องการ");
                else
                {
                    contentExportLines.Add(line);
                }
            }

            contentExport = string.Join("\r\n", contentExportLines.ToArray());

            HttpContext.Current.Response.AddHeader("Content-disposition",
                string.Format("attachment; filename=pip_{0}_{1}.txt", strPipRefNo, DateTime.Now.ToString("yyyyMMdd")));
            HttpContext.Current.Response.ContentType = "application/octet-stream";
            HttpContext.Current.Response.Write(contentExport);
            HttpContext.Current.Response.End();
        }
    }
}